package se.study.io.ser;

import java.io.*;
/* 序列化和反序列化的两个问题：
 *      问题1：如果某些数据不需要做序列化，比如密码，比如上面的年龄？
 *           解决办法：在字段面前加上 transient
 *
 *           private String name;//需要序列化
 *           transient private int age;//不需要序列化
 *
 *      问题2：序列化版本问题，在完成序列化操作后，由于项目的升级或修改，可能我们会对序列化对象进行修改，比如增加某个字段，那么我们在进行反序列化就会报错：
 *           解决办法：在 JavaBean 对象中增加一个 serialVersionUID 字段，用来固定这个版本，无论我们怎么修改，版本都是一致的，就能进行反序列化了
 *
 *           private static final long serialVersionUID = 8656128222714547171L;
*/

/**
 * @Author: tiger
 * @Date:2018/5/8
 * @Description:序列化与反序列化
 */
public class SerializeJavaBean {
    public static void main(String[] args) {
//        serializeJavabean();
        unSerializeJavabean();
    }

    /**
     * 使用 ObjectInputStream 对象实现序列化
     * 反序列化的对象必须要提供该对象的字节码文件.class
     * 1.我们打开 a.txt 文件，发现里面的内容乱码，注意这不需要我们来看懂，这是二进制文件，计算机能读懂就行了。
     * 2.Person类必须实现 Serializable 接口，否则报错
     */
    private static void unSerializeJavabean() {
        File file = new File("C:\\Users\\Administrator\\Desktop\\output_test.txt");
        try {
            ObjectInputStream os = new ObjectInputStream(new FileInputStream(file));
            Person p = (Person) os.readObject();
            os.close();

            System.out.println(p.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用 ObjectOutputStream 对象实现序列化
     * 1.我们打开 a.txt 文件，发现里面的内容乱码，注意这不需要我们来看懂，这是二进制文件，计算机能读懂就行了。
     * 2.Person类必须实现 Serializable 接口，否则报错
     */
    private static void serializeJavabean() {
        File file = new File("C:\\Users\\Administrator\\Desktop\\output_test.txt");
        try {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file, true));
            objectOutputStream.writeObject(new Person("zhangsan", "122112", 20));
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
